// 3. 具体主题：气象数据
/// <summary>
/// 具体主题类，实现了ISubject接口
/// 负责管理气象数据，并在数据变化时通知所有已注册的观察者
/// </summary>
public class WeatherData : ISubject
{
  /// <summary>
  /// 存储所有已注册的观察者列表
  /// </summary>
  private readonly List<IObserver> _observers = new();
  
  /// <summary>
  /// 当前温度值
  /// </summary>
  private float _temperature;
  
  /// <summary>
  /// 当前湿度值
  /// </summary>
  private float _humidity;
  
  /// <summary>
  /// 当前气压值
  /// </summary>
  private float _pressure;

  /// <summary>
  /// 设置新的气象测量数据并触发通知
  /// </summary>
  /// <param name="temp">新的温度值</param>
  /// <param name="humidity">新的湿度值</param>
  /// <param name="pressure">新的气压值</param>
  public void SetMeasurements(float temp, float humidity, float pressure)
  {
    _temperature = temp;
    _humidity = humidity;
    _pressure = pressure;
    NotifyObservers(); // 数据一变，立即通知
  }

  /// <summary>
  /// 实现ISubject接口的注册观察者方法
  /// 将观察者添加到观察者列表中
  /// </summary>
  /// <param name="observer">要注册的观察者</param>
  public void RegisterObserver(IObserver observer) => _observers.Add(observer);
  
  /// <summary>
  /// 实现ISubject接口的移除观察者方法
  /// 从观察者列表中移除指定的观察者
  /// </summary>
  /// <param name="observer">要移除的观察者</param>
  public void RemoveObserver(IObserver observer) => _observers.Remove(observer);

  /// <summary>
  /// 实现ISubject接口的通知方法
  /// 向所有已注册的观察者发送当前的气象数据
  /// </summary>
  public void NotifyObservers()
  {
    foreach (var observer in _observers)
    {
      observer.Update(_temperature, _humidity, _pressure);
    }
  }
}